package controller

import (
	"context"
	beego "github.com/beego/beego/v2/server/web"
	"github.com/shopspring/decimal"
	"github.com/wechatpay-apiv3/wechatpay-go/core"
	"github.com/wechatpay-apiv3/wechatpay-go/core/option"
	"github.com/wechatpay-apiv3/wechatpay-go/utils"
)

type WeixinPayBaseController struct {
}

/**
 * 获取微信支付的client对象
 * @author feige
 * @date 2023-12-04
 * @version 1.0
 * @desc
 */
func (web *WeixinPayBaseController) GetWeixinPayClient() (*core.Client, context.Context) {

	mchID := beego.AppConfig.DefaultString("weixin.pay.mchid", "")
	mchCertificateSerialNumber := beego.AppConfig.DefaultString("weixin.pay.mchserial", "")
	mchAPIv3Key := beego.AppConfig.DefaultString("weixin.pay.mchv3key", "")
	mchPrivateKeyPath := beego.AppConfig.DefaultString("weixin.pay.privatekey", "")

	// 使用 util 提供的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
	mchPrivateKey, err := utils.LoadPrivateKeyWithPath(mchPrivateKeyPath)
	if err != nil {
		return nil, nil
	}

	ctx := context.Background()
	// 使用商户私钥等初始化 client，并使它具有自动定时获取微信支付平台证书的能力
	opts := []core.ClientOption{
		option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
	}
	client, err := core.NewClient(ctx, opts...)
	if err != nil {
		return nil, nil
	}

	return client, ctx
}

// 元转分,乘以100后，保留整数部分
func (web *WeixinPayBaseController) Yuan2Fen(price string) int64 {
	d := decimal.New(1, 2) //分转元乘以100
	fromString, _ := decimal.NewFromString(price)
	df := fromString.Mul(d).IntPart()
	return df
}

// 元转分,乘以100后，保留整数部分
func (web *WeixinPayBaseController) Yuan2FenRound(price string) int64 {
	d := decimal.New(1, 2)  //分转元乘以100
	d1 := decimal.New(1, 0) //乘完之后，保留2为小数，需要这么一个中间参数
	fromString, _ := decimal.NewFromString(price)
	//如下是满足，当乘以100后，仍然有小数位，取四舍五入法后，再取整数部分
	dff := fromString.Mul(d).DivRound(d1, 0).IntPart()
	return dff
}

// 元转分,乘以100后，保留整数部分
func (web *WeixinPayBaseController) Yuan2FenRoundNo(price string) int64 {
	d1 := decimal.New(1, 0) //乘完之后，保留2为小数，需要这么一个中间参数
	fromString, _ := decimal.NewFromString(price)
	//如下是满足，当乘以100后，仍然有小数位，取四舍五入法后，再取整数部分
	dff := fromString.DivRound(d1, 0).IntPart()
	return dff
}

// 元转分,乘以100后，保留整数部分
func (web *WeixinPayBaseController) Yuan2FenRoundFloat64(price string) float64 {
	d := decimal.New(1, 2)  //分转元乘以100
	d1 := decimal.New(1, 0) //乘完之后，保留2为小数，需要这么一个中间参数
	fromString, _ := decimal.NewFromString(price)
	//如下是满足，当乘以100后，仍然有小数位，取四舍五入法后，再取整数部分
	f, _ := fromString.Mul(d).DivRound(d1, 0).Float64()
	return f
}

// 分转元
func (web *WeixinPayBaseController) Fen2Yuan(price uint64) string {
	d := decimal.New(1, 2) //分除以100得到元
	result := decimal.NewFromInt(int64(price)).DivRound(d, 2).String()
	return result
}
